
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;

#include <chrono>
#include <cstdio>
void MyTimer(int type, const char *info = nullptr) {
  static std::chrono::steady_clock::time_point start;
  if (type == 0) {
    start = std::chrono::steady_clock::now();
    printf("Begin %s\n", info);
    return;
  } else {
    auto end = std::chrono::steady_clock::now();
    auto dt =
        std::chrono::duration_cast<std::chrono::duration<double>>(end - start);
    printf("End %s, time taken=%lf\n", info, dt.count());
  }
}

struct INTERPLIST {
  // 这个插值信息是否被取消的标志  为1代表丢弃
  int cancel;
  // 供体单元的顶点数,有几个顶点就有几个插值系数
  int nweights;
  // 0: 对应send&recvMap的索引,可用其确定进程号
  // 1: 顶点编号(远程相交块中的)
  // 2: 顶点属于远程进程中的那一个块 remote block id
  int receptorInfo[3];
  double xtmp[3];
  // 下面两个推荐使用静态数组  大小均为nweights+1
  // 保存供体单元的顶点编号  最后一个保存供体单元的单元编号
  // 我觉得这个不用单独存储  存储单元编号就可以了
  size_t inode[8];
  // 保存插值系数   最后一个赋值为0.0了
  double weights[8];

  INTERPLIST(){};

  void init() {
    cancel = 0;
    nweights = 0;
    receptorInfo[0] = receptorInfo[1] = receptorInfo[2] = 2;
    xtmp[0] = xtmp[1] = xtmp[2] = 3;
  }
};

int main() {
  int n = 10000000;
  MyTimer(0, "vector");

  vector<INTERPLIST> ip(n);
  MyTimer(1, "  ");

  MyTimer(0, "malloc");
  INTERPLIST *p = (INTERPLIST *)malloc(sizeof(INTERPLIST) * n);
  MyTimer(1, "  ");

  cout << p[n - 1].weights[7] << "  " << endl;

  for (int i = 0; i < n; ++i)
    p[i].init();
  p[0].init();
  p[1].init();

  cout << p[n - 1].xtmp[0] << endl;
  free(p);
  return 0;
}
